package models

import (
	"database/sql"
	"go-gin-example/pkg/setting"
	"log"
	"time"

	// "gitee.com/code_fun/go/src/go-gin-example/pkg/setting"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"gorm.io/gorm/schema"
)

var db *gorm.DB
var sqlDB *sql.DB

type Model struct {
	//gorm.Model
	ID         int            `gorm:"primary_key" json:"id"`
	CreatedOn  int            `json:"created_on"`
	ModifiedOn int            `json:"modified_on"`
	DeletedOn  gorm.DeletedAt `gorm:"softDelete:flag"`
}

func Setup() {
	// var (
	// 	err error
	// 	//dbType,
	// 	dbName, user, password, host, tablePrefix string
	// )

	var err error

	//sec, err := setting.Cfg.GetSection("database") // 获取app.ini中的database节点的属性
	database := setting.DatabaseSetting
	// if err != nil {
	// 	log.Fatal(2, "Fail to get section 'database': %v", err)
	// }

	// 数据库属性
	//dbType = sec.Key("TYPE").String()
	// dbName = sec.Key("NAME").String()
	// user = sec.Key("USER").String()
	// password = sec.Key("PASSWORD").String()
	// host = sec.Key("HOST").String()
	// tablePrefix = sec.Key("TABLE_PREFIX").String()

	// mysql数据库连接
	// dsn := user + ":" + password + "@tcp(" + host + ")/" + dbName + "?charset=utf8mb4&parseTime=True&loc=Local"
	dsn := database.User + ":" + database.Password + "@tcp(" + database.Host + ")/" + database.Name + "?charset=utf8mb4&parseTime=True&loc=Local"
	// 简单配置
	// gorm.Open(mysql.Open(dsn), &gorm.Config{})
	// db, err := gorm.Open(mysql.New(mysql.Config{ 大坑，全局变量不要使用:= 否则其他地方使用会报错nil pointer
	db, err = gorm.Open(mysql.New(mysql.Config{
		DSN:                       dsn,   // DSN data source name
		DefaultStringSize:         256,   // string 类型字段的默认长度
		DisableDatetimePrecision:  true,  // 禁用 datetime 精度，MySQL 5.6 之前的数据库不支持
		DontSupportRenameIndex:    true,  // 重命名索引时采用删除并新建的方式，MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
		DontSupportRenameColumn:   true,  // 用 `change` 重命名列，MySQL 8 之前的数据库和 MariaDB 不支持重命名列
		SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置
	}), &gorm.Config{
		Logger:         logger.Default.LogMode(logger.Info),
		NamingStrategy: schema.NamingStrategy{TablePrefix: database.TablePrefix, SingularTable: true}, //
	})

	if err != nil {
		log.Println(err)
	}
	sqlDB, err = db.DB()
	if err != nil {
		log.Println(err)
	}
	sqlDB.SetMaxIdleConns(10)
	sqlDB.SetMaxOpenConns(100)
	sqlDB.SetConnMaxLifetime(time.Hour)

}

// 关闭数据
func CloseDB() {
	defer sqlDB.Close()
}

// updateTimeStampForCreateCallback will set `CreatedOn`, `ModifiedOn` when creating
// func updateTimeStampForCreateCallback(scope *gorm.) {
// 	if ()
// }
